package pub.cleangao.mybatis.dao;

import org.apache.ibatis.annotations.Param;

import java.util.*;

/**
 * 具备保存功能的Mapper
 *
 * @param <E>实体类类型
 */
public interface CreateMapper<E, I> extends Mapper<E> {

    /**
     * 保存，保存所有字段
     *
     * @param entity 实体类
     * @return 受影响行数
     * --> 1:XML中方法
     */
    int saveAllFields(@Param("entity") E entity);

    /**
     * 保存，忽略null字段
     *
     * @param entity 实体类
     * @return 受影响行数
     * --> 2:XML中方法
     */
    int save(@Param("entity") E entity);


    /**
     * 批量保存
     * --> 3:XML中方法
     */
    int saveMultiSet(@Param("entities") Collection<E> entities);


    // -----------------------------------------------------------------------------

    /**
     * 批量保存，去除重复行，通过对象是否相对判断重复数据，实体类需要实现equals方法.
     *
     * @param entities 实体类集合，需要实现equals方法
     * @return 受影响行数
     */
    default int saveUnique(Collection<E> entities) {
        return saveUnique(entities, null);
    }

    /**
     * 批量保存，去除重复行，指定比较器判断
     *
     * @param entities   实体类集合，需要实现equals方法
     * @param comparator 对象比较器
     * @return 受影响行数
     */
    default int saveUnique(Collection<E> entities, Comparator<E> comparator) {
        if (entities == null || entities.isEmpty()) {
            return 0;
        }
        if (comparator == null) {
            return saveMultiSet(new HashSet<>(entities));
        }
        List<E> list = new ArrayList<>(entities);
        for (int i = 0; i < list.size() - 1; i++) {
            E obj1 = list.get(i);
            for (int j = list.size() - 1; j > i; j--) {
                E obj2 = list.get(j);
                if (comparator.compare(obj1, obj2) == 0) {
                    list.remove(j);
                }
            }
        }
        return saveMultiSet(list);
    }
}
